// 路由鉴权:鉴权,项目当中路由能不能被的权限的设置(某一个路由什么条件下可以访问、什么条件下不可以访问)
import router from './router'
import setting from './setting'
// @ts-ignore
import nprogress from 'nprogress'
// 引入进度条样式
import 'nprogress/nprogress.css'
nprogress.configure({ showSpinner: false })

// 获取pinia大仓库
import pinia from './store'
// 获取用户小仓库数据
import useUserStore from './store/modules/user'
// 在这里如果不引入pinia并传入，是拿不到仓库的
const userStore = useUserStore(pinia)


router.beforeEach(async (to: any, from: any, next: any) => {
  console.log('路由鉴权', to, from)
  document.title = `${setting.title} - ${to.meta.title}`

  // 进度条开始
  nprogress.start()

  // 获取token,去判断用户登录、还是未登录
  const token = userStore.token
  // 获取用户名字
  const username = userStore.username
  // 如果用户已登录
  if (token) {
    if (to.name === 'login') {
      next({ name: 'home' })
    } else {
      if (!username) {
        // 如果用户登录了，但是没有用户信息, 获取用户信息再放行
        try {
          await userStore.userInfo()
          // 原来写的next(),改成next({...to})，原因是刷新页面的时候如果是异步路由,有可能获取到用户信息后异步路由还没有加载完毕,出现空白的效果
          next({ ...to })
        } catch (error) {
          console.log(444444444444444444)
          // token过期获取不到用户信息了，或者，用户手动修改了token
          await userStore.userLogout()
          next({ name: 'login', query: { redirect: to.path } })
        }
      } else {
        // 如果用户登录了，有用户信息，直接放行
        next()
      }
    }
  } else {
    // 如果用户未登录
    if (to.name === 'login') {
      next()
    } else {
      next({ name: 'login', query: { redirect: to.path } })
    }
  }
})

router.afterEach(() => {
  // 进度条结束
  nprogress.done()
})
